﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Brainee.Search;

namespace Brainee.Optimization
{
  public interface IOptimizationProblem
  {
    /// <summary>
    /// Get or set the initial state that the agent starts in.
    /// </summary>
    IState InitialState { get; set; }

    /// <summary>
    /// A description of the possible actions available to the agent for a given state. 
    /// </summary>
    /// <param name="state"></param>
    /// <returns>
    /// Given a particular state, Successor returns a set of states,
    /// where each action is one of the legal actions in current state and each successor is a 
    /// state that can be reached from the current one by applying the action.
    /// </returns>
    IEnumerable<IState> Successors (IState state);

    IState RandomSuccessor (IState state);

    double Evaluate (IState currentState);
  }
}
